package prova;

import java.util.ArrayList;
import java.util.Iterator;

import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Polygon;

public class ParticelleConCambiamento {
	
	/* 
	 * QUESTA CLASSE ASSOCIA I CAMBIAMENTI AD UNA PARTICELLA CATESTALE.
	 * RESTITUISCE:
	 * ArrayList<ParticellaCatastale> ParticelleCambiamento 
	 * 
	 */
	private ArrayList<ParticellaCatastale> ParticelleCambiamento;
	
	public static ArrayList<ParticellaCatastale> CreaListaParticelleConCambiamento(ArrayList<Cambiamento> ListaPuntiCD,	ArrayList<ParticellaCatastale> ListaParticelle){
		/*
		 * QUESTO METODO PRENDE IN INGRESSO :
		 * ArrayList<Cambiamento> ListaPuntiCD	
		 * ArrayList<ParticellaCatastale> ListaParticelle
		 * IL METODO CONTROLLA SE OGNI PUNTO IN ListaPuntiCD E' CONTENUTO
		 * IN OGNI PARTICELLA CATASTALE ListaParticelle.
		 * PER TALE FINE VIENE CHIAMATO IL METODO ParticellaContienePunto.
		 * particella.setCDType(cambiamento.getCDType());
		 * INVECE CARICA NELLA PARTICELLA IL TIPO DI CAMBIAMENTO
		 * 
		 * */
		ArrayList<ParticellaCatastale> ArrayParticelleCD = new ArrayList<ParticellaCatastale>();
		Iterator<ParticellaCatastale> iParticella = ListaParticelle.iterator();
		
		while (iParticella.hasNext()){
			ParticellaCatastale particella = iParticella.next();
			Iterator<Cambiamento> iPunto = ListaPuntiCD.iterator();
			while (iPunto.hasNext()){
				Cambiamento cambiamento = iPunto.next();
				if (ParticellaContienePunto(particella, cambiamento)){
				
					particella.setCDType(cambiamento.getCDType());					
					ArrayParticelleCD.add(particella);
					
					}		
			}
		}		
	return ArrayParticelleCD;	
	}
	
	
	

	
	
	public static boolean ParticellaContienePunto(ParticellaCatastale particella,Cambiamento cambiamento){
		/*
		 * CONTROLLA SE IL CAMBIAMENTO E' CONTENUTO NELLA PARTICELLA
		 */
		Geometry geometriaPunto = GeneraGeometriaPunto(cambiamento);
		Geometry geometriaParticella = GeneraGeometriaParticella(particella);
		
		boolean test = geometriaParticella.contains(geometriaPunto);	
		
		return test;
	}
	

	public static Geometry GeneraGeometriaParticella (ParticellaCatastale particella){
		
		/*
		 * CREA LA GEOMETRIA DELLA PARTICELLA
		 */
		
		Polygon poligono = particella.getPoligono();
						
		return poligono;
		
	}
	
	public static Geometry GeneraGeometriaPunto (Cambiamento cambiamento){
		
		/*
		 * GENERA LA GEOMETRIA DEL PUNTO
		 */
		
		Punto punto = new Punto();
		
		punto = cambiamento.getPunto();
		
		Coordinate coordinate = new Coordinate (punto.getX() , punto.getY());
		Geometry geometria = new GeometryFactory().createPoint(coordinate);
				
		return geometria;
		
	}
	// MAIN
	public static void main(String[] args){
		
		ArrayList<Cambiamento> ListaPuntiCD = GetListaCD.getListaCD();
		ArrayList<ParticellaCatastale> ListaParticelle = GetListaPoligoni.getListaParticelle();
		ArrayList<ParticellaCatastale> particelleCambiamento = new ArrayList<ParticellaCatastale>();
		particelleCambiamento = CreaListaParticelleConCambiamento(ListaPuntiCD, ListaParticelle);
		displayParticelle(particelleCambiamento);
	
		
	
}

	public ArrayList<ParticellaCatastale> getParticelleCambiamento() {
		
		ArrayList<Cambiamento> ListaPuntiCD = GetListaCD.getListaCD();
		ArrayList<ParticellaCatastale> ListaParticelle = GetListaPoligoni.getListaParticelle();
		ParticelleCambiamento = CreaListaParticelleConCambiamento(ListaPuntiCD, ListaParticelle);
		return ParticelleCambiamento;
	}
	
	public static void displayListaCD (ArrayList<Cambiamento> ListaPuntiCD){
		Iterator<Cambiamento> iPunto = ListaPuntiCD.iterator();
		
		while (iPunto.hasNext()){
			Cambiamento camb = iPunto.next();
			System.out.println("test display "+camb.getPunto().getX()+ " + "+ camb.getPunto().getY());
		}
	}

	
	public static void displayParticelle (ArrayList<ParticellaCatastale> ListaParticelle){
		
		/*
		 * METODO DI TEST 
		 */
		
		Iterator<ParticellaCatastale> iPart = ListaParticelle.iterator();
		while (iPart.hasNext()){
			ParticellaCatastale pc = iPart.next();
			System.out.print("x: "+pc.getArrayPunti().get(0).getX() + " + ");
			System.out.print("y: "+ pc.getArrayPunti().get(0).getY() + " + ");
			System.out.print("CD: " + pc.getCDType());
		
		}
	}

	public static void displayParticelleCambiamento (ArrayList<ParticelleConCambiamento> ListaParticelle){
		
		/*
		 * METODO DI TEST 
		 */
		
		Iterator<ParticelleConCambiamento> iPart = ListaParticelle.iterator();
		while (iPart.hasNext()){
			ParticelleConCambiamento pc = iPart.next();
			System.out.println("x: "+pc.getParticelleCambiamento().get(0).getCDType());
		}
	}

	

	




}
